/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.dwh.trigger;

/**
 *
 * @author Jose Carlos Palma
 * @version v1.0.0
 */
public abstract class ThreadSocket extends Thread {

    /**
     * Constante que representa que el tipo de socket es Origen.
     */
    public static final int SOURCE = 0;
    /**
     * Constante que representa que el tipo de socket es Destino.
     */
    public static final int TARGET = 1;
    /**
     * Constante que representa que el tipo de socket es Servidor.
     */
    public static final int SERVER = 2;
    /**
     * Es el nombre del socket.
     */
    protected String name;
    /**
     * Controla el ciclo del socket.
     */
    private boolean running = false;
    /**
     * Controla que el socket ya salio del ciclo.
     */
    private boolean shutDown = true;
    /**
     * Almacena el tipo de socket.
     * @see org.dwh.trigger.ThreadSocket#SOURCE
     * @see org.dwh.trigger.ThreadSocket#TARGET
     * @see org.dwh.trigger.ThreadSocket#SERVER
     */
    private int type = -1;

    /**
     * 
     * @param name
     */
    public ThreadSocket(String name) {
        this.name = name;
    }

    /**
     * Inicia el hilo, y establece el atributo running en verdadero.
     */
    @Override
    public final synchronized void start() {
        super.start();
        //Indica que el hilo comienza el ciclo.
        running = true;
        //Indica que el hilo esta arriba.
        shutDown = false;
    }

    /**
     * Ejecuta el hilo.
     */
    @Override
    public final void run() {
        
        
        core();


        //Indica que el hilo termino su ejecución.
        shutDown();
    }

    /**
     * Contiene la lógica de los socket.
     * @see org.dwh.trigger.ClientSocket#core()
     * @see org.dwh.trigger.ServerSocket#core() 
     */
    public abstract void core();

    /**
     * Indica si el socket es del tipo Origen(Source).
     * @return verdadero si el socket es Origen.
     */
    public final boolean isSource() {
        return type == SOURCE;
    }

    /**
     * Indica si el socket es del tipo Destino(Target).
     * @return verdadero si el socket es Destino.
     */
    public final boolean isTarget() {
        return type == TARGET;
    }

    /**
     * Indica si el socket es del tipo Servidor(Server).
     * @return verdadero si el socket es Servidor.
     */
    public final boolean isServer() {
        return type == SERVER;
    }

    /**
     * Establece que el socket es del tipo Origen(Source).
     */
    public final void setSource() {
        this.type = SOURCE;
    }

    /**
     * Establece que el socket es del tipo Destino(Target).
     */
    public final void setTarget() {
        this.type = TARGET;
    }

    /**
     * Establece que el socket es del tipo Servidor(Server).
     */
    public final void setServer() {
        this.type = SERVER;
    }

    /**
     * Indica si el hilo está cerrado.
     * @return verdadero si el hilo esta cerrado.
     */
    public final boolean isShutDown() {
        return shutDown;
    }

    /**
     * Establece el atributo shutdown en verdadero.
     */
    public final void shutDown() {
        this.shutDown = true;
    }

    /**
     * Indica si el hilo está ejecutandose.
     * @return verdadero si el hilo está en ejecución.
     */
    public final boolean isRunning() {
        return running;
    }

    /**
     * Establece el atributo running en falso.
     */
    public final void halt() {
        this.running = false;

    }

    /**
     * Hace una pausa en milisegundos.
     * @param millis
     */
    public final void pause(long millis) {
        try {
            sleep(millis);
        } catch (InterruptedException ex) {
        }
    }
}
